/*******************************************************************************
  * 文件：YLDeviceCtrl.c
  * 作者：djy
  * 版本：v1.0.0
  * 日期：2024-02-22
  * 说明：功率板负载控制
*******************************************************************************/
/* 头文件 *********************************************************************/
#include "YLDeviceCtrl.h"
#include "YLComm.h"
#include "ADTab.h"
#include "Debug.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
typedef struct
{
    YLFrameSendData_ts	sChn1CZ1SendData;
    YLFrameSendData_ts	sChn1CZ2SendData;
    YLFrameSendData_ts	sChn2CZ1SendData;
    YLFrameSendData_ts	sChn2CZ2SendData;
    Timer_ts  sTimer;
}YLComm_DevCtrl_ts; // 跃龙协议-设备控制块

/* 变量定义 *******************************************************************/
static YLComm_DevCtrl_ts sYLCommDevCtrl;
YLCommDevInfor_ts sYLDevInfor;

/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

// 获取CZ真实功率
U16 YLComm_RealPowerGet(U8 u8CZIndex)
{
    // 将功率还原为真是功率，×20
    return (sYLDevInfor.u8RealPower[u8CZIndex] * 20);
}

// 获取CZ的IGBT温度
U8 YLComm_IGBTTempGet(U8 u8CZIndex)
{
    // 查表法，将AD值转换为温度
    return AD_IGBT_TemperTab[sYLDevInfor.u8AD_IGBTTemper[u8CZIndex]];
}

// 获取CZ的面板温度
U8 YLComm_CoilTempGet(U8 u8CZIndex)
{
    // 查表法，将AD值转换为温度
    return AD_PanelTemper_Tab[sYLDevInfor.u8AD_CoilTemper[u8CZIndex]];
}

// 获取CZ母线电压
U16 YLComm_ACVoltageGet(U8 u8CZIndex)
{
    // 查表法，将AD值转换为电压
    return AD_Volt_Tab[sYLDevInfor.u8AD_Voltage[u8CZIndex]];
}

// 获取CZ有无锅
U8 YLComm_PanStateGet(U8 u8CZIndex)
{
    return sYLDevInfor.u8PanState[u8CZIndex];
}

// 功率板-负载控制定时回调函数
static void YLComm_DeviceCtrlTimingHook(void)
{
    // 根据到期次数，循环控制CZ1和CZZ2
    if(OS_TimerGetExpiredTimes(&sYLCommDevCtrl.sTimer)%2)
    {
        // Chn1-CZ1 控制数据下发
        YLComm_Chn1SendFrame(U8_YL_COMM_CZ1_ADDR,(U8*)&sYLCommDevCtrl.sChn1CZ1SendData,sizeof(YLFrameSendData_ts));
        
        // Chn2-CZ1 控制数据下发
        YLComm_Chn2SendFrame(U8_YL_COMM_CZ1_ADDR,(U8*)&sYLCommDevCtrl.sChn2CZ1SendData,sizeof(YLFrameSendData_ts));
    }
    else
    {
        // Chn1-CZ2 控制数据下发
        YLComm_Chn1SendFrame(U8_YL_COMM_CZ2_ADDR,(U8*)&sYLCommDevCtrl.sChn1CZ2SendData,sizeof(YLFrameSendData_ts));
        
        // Chn2-CZ2 控制数据下发
        YLComm_Chn2SendFrame(U8_YL_COMM_CZ2_ADDR,(U8*)&sYLCommDevCtrl.sChn2CZ2SendData,sizeof(YLFrameSendData_ts));
        
        // 清空到期次数
        OS_TimerClearExpiredTimes(&sYLCommDevCtrl.sTimer);
    }
}

// CookZone功率控制
void YLComm_CookZoneCtrl(U8 u8CZIndex,U8 u8GoalPower)
{
    switch(u8CZIndex)
    {
    case u8CZ1:
        // 检测目标功率是否合法，限制在3000W以内
        if(0 < u8GoalPower && u8GoalPower <= 150)
        {
            sYLCommDevCtrl.sChn1CZ1SendData.u1CZOnOffStatus = 1;
        }
        else
        {
            sYLCommDevCtrl.sChn1CZ1SendData.u1CZOnOffStatus = 0;
            
            u8GoalPower = 0;
        }
        
        // 更新目标功率
        sYLCommDevCtrl.sChn1CZ1SendData.u8GoalPower = u8GoalPower;
    break;
    case u8CZ2:
        // 检测目标功率是否合法，限制在3000W以内
        if(0 < u8GoalPower && u8GoalPower <= 150)
        {
            sYLCommDevCtrl.sChn1CZ2SendData.u1CZOnOffStatus = 1;
        }
        else
        {
            sYLCommDevCtrl.sChn1CZ2SendData.u1CZOnOffStatus = 0;
            
            u8GoalPower = 0;
        }
        
        // 更新目标功率
        sYLCommDevCtrl.sChn1CZ2SendData.u8GoalPower = u8GoalPower;
    break;
    case u8CZ3:
        // 检测目标功率是否合法，限制在3000W以内
        if(0 < u8GoalPower && u8GoalPower <= 150)
        {
            sYLCommDevCtrl.sChn2CZ1SendData.u1CZOnOffStatus = 1;
        }
        else
        {
            sYLCommDevCtrl.sChn2CZ1SendData.u1CZOnOffStatus = 0;
            
            u8GoalPower = 0;
        }
        
        // 更新目标功率
        sYLCommDevCtrl.sChn2CZ1SendData.u8GoalPower = u8GoalPower;
    break;
    case u8CZ4:
        // 检测目标功率是否合法，限制在3000W以内
        if(0 < u8GoalPower && u8GoalPower <= 150)
        {
            sYLCommDevCtrl.sChn2CZ2SendData.u1CZOnOffStatus = 1;
        }
        else
        {
            sYLCommDevCtrl.sChn2CZ2SendData.u1CZOnOffStatus = 0;
            
            u8GoalPower = 0;
        }
        
        // 更新目标功率
        sYLCommDevCtrl.sChn2CZ2SendData.u8GoalPower = u8GoalPower;
    break;
    default:
    break;
    }
}

// 初始化
void YLComm_DevCtrlInit(void)
{
    // 初始化设备信息
    // 锅具类型
    sYLCommDevCtrl.sChn1CZ1SendData.u8PanType = 0xC5;
    sYLCommDevCtrl.sChn1CZ2SendData.u8PanType = 0xC5;
    sYLCommDevCtrl.sChn2CZ1SendData.u8PanType = 0xC5;
    sYLCommDevCtrl.sChn2CZ2SendData.u8PanType = 0xC5;

    // 移锅电流阈值
    sYLCommDevCtrl.sChn1CZ1SendData.u8RemovePanCurrentValue = 0x0B;
    sYLCommDevCtrl.sChn1CZ2SendData.u8RemovePanCurrentValue = 0x0B;
    sYLCommDevCtrl.sChn2CZ1SendData.u8RemovePanCurrentValue = 0x0B;
    sYLCommDevCtrl.sChn2CZ2SendData.u8RemovePanCurrentValue = 0x0B;

    // PPG Delay
    sYLCommDevCtrl.sChn1CZ1SendData.u8PPGDelay = 0x0F;
    sYLCommDevCtrl.sChn1CZ2SendData.u8PPGDelay = 0x0F;
    sYLCommDevCtrl.sChn2CZ1SendData.u8PPGDelay = 0x0F;
    sYLCommDevCtrl.sChn2CZ2SendData.u8PPGDelay = 0x0F;

    // 启动定时器，定时控制功率板
    OS_TimerRestart(&sYLCommDevCtrl.sTimer,120,YLComm_DeviceCtrlTimingHook);
}

/***************************** 文件结束 ***************************************/
